package com.fs.controller.user;

import com.fs.constant.JwtClaimsConstant;
import com.fs.dto.OrderCreateDTO;
import com.fs.properties.JwtProperties;
import com.fs.result.Result;
import com.fs.service.OrderService;
import com.fs.utils.JwtUtil;
import com.fs.vo.OrderUserVO;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 用户端 - 订单管理控制器
 * 功能说明：
 *   - 提供订单创建、支付、取消、确认收货、查询等接口
 *   - 所有接口均基于登录用户的 token 获取 userId
 *   - 供 Swagger 测试与前端调用使用
 */
@RestController
@RequestMapping("/user/order")
@Api(tags = "用户端-订单管理接口")
@Slf4j
public class OrderController {

    @Autowired
    private OrderService orderService;
    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 【功能】用户创建订单（从购物车生成）
     * 【业务逻辑】
     *   1. 从 token 获取 userId；
     *   2. 计算总金额；
     *   3. 插入订单主表与明细表；
     *   4. 返回订单号。
     */
    @PostMapping("/create")
    @ApiOperation("创建订单")
    public Result<String> createOrder(@RequestBody OrderCreateDTO dto, HttpServletRequest request) {
        log.info("用户下单请求：{}", dto);
        Long userId = TokenUserId(request);
        String message = orderService.createOrder(dto, userId);
        return Result.success(message);
    }

    /**
     * 【功能】查询用户订单列表
     * 【业务逻辑】
     *   1. 从 token 获取 userId；
     *   2. 支持按状态分类查询；
     *   3. 若 status 为 null，则查询全部；
     *   4. 返回订单列表含明细。
     */
    @GetMapping("/list")
    @ApiOperation("查询订单列表（可按状态筛选）")
    @ApiImplicitParam(name = "status", value = "订单状态：0待支付 1待发货 2已发货 3已完成 4已取消", required = false)
    public Result<List<OrderUserVO>> listOrders(@RequestParam(value = "status", required = false) Integer status,
                                                HttpServletRequest request) {
        Long userId = TokenUserId(request);
        List<OrderUserVO> list = orderService.listUserOrders(status, userId);
        return Result.success(list);
    }

    /**
     * 【功能】查询订单详情
     * 【业务逻辑】
     *   1. 校验订单是否属于当前用户；
     *   2. 查询主表与明细表；
     *   3. 返回完整 VO 数据。
     */
    @GetMapping("/{id}")
    @ApiOperation("查询订单详情")
    public Result<OrderUserVO> getOrderDetail(@PathVariable Long id, HttpServletRequest request) {
        OrderUserVO vo = orderService.getOrderDetail(id, request);
        return Result.success(vo);
    }

    /**
     * 【功能】模拟支付订单
     * 【业务逻辑】
     *   1. 校验订单状态是否为“待支付”；
     *   2. 修改状态为“待发货”；
     *   3. 更新支付时间。
     */
    @PutMapping("/pay/{id}")
    @ApiOperation("支付订单（模拟支付）")
    public Result<String> payOrder(@PathVariable Long id, HttpServletRequest request) {
        String message = orderService.payOrder(id, request);
        return Result.success(message);
    }

    /**
     * 【功能】取消订单
     * 【业务逻辑】
     *   1. 仅“待支付”订单可取消；
     *   2. 更新状态为“已取消”；
     *   3. 记录取消时间。
     */
    @PutMapping("/cancel/{id}")
    @ApiOperation("取消订单")
    public Result<String> cancelOrder(@PathVariable Long id, HttpServletRequest request) {
        String message = orderService.cancelOrder(id, request);
        return Result.success(message);
    }

    /**
     * 【功能】确认收货
     * 【业务逻辑】
     *   1. 校验状态为“已发货”；
     *   2. 更新状态为“已完成”；
     *   3. 记录收货时间。
     */
    @PutMapping("/confirm/{id}")
    @ApiOperation("确认收货")
    public Result<String> confirmOrder(@PathVariable Long id, HttpServletRequest request) {
        String message = orderService.confirmOrder(id, request);
        return Result.success(message);
    }



    //获取token中的userid
    private Long TokenUserId(HttpServletRequest request){
        String token = request.getHeader("Authorization");
        if (token == null || token.isEmpty()) {
            token = request.getHeader("token"); // 兼容 Swagger
        }

        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }
        // 解密 token
        String secretKey = jwtProperties.getAdminSecretKey();
        Claims claims = JwtUtil.parseJWT(secretKey, token);
        // ⚠️ 注意这里改成 userId（与生成端一致）
        Object userIdObj = claims.get(JwtClaimsConstant.USER_ID);
        Long userId = Long.valueOf(userIdObj.toString());
        return userId;
    }

}
